home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / wwiv.arc / DOS.PAS < prev    next >
Pascal/Delphi Source File  |  1986-04-21  |  36KB  |  1,251 lines

  1. program dos;
  2.  
  3.  
  4.                       {*****************************}
  5.                       {Copyright (c) 1986 Wayne Bell}
  6.                       {*****************************}
  7.  
  8. {$C-} {$V-}
  9. {$I COMMON.PAS}
  10.  
  11. var topheap:^byte;
  12.     i1:str;
  13.     ix:array[1..9] of string[79];
  14.     donedos,dld,d1,d2,done,abort:boolean;
  15.     c1,c2,c3:integer;
  16.     f,f1:file of byte;
  17.     x:byte;
  18.     cd:str;
  19.     s1,s2,s3:str;
  20.     all:boolean;
  21.     chksum:byte;
  22.     crc:integer;
  23.     ucrc,ymodem:boolean;
  24.     fat,dta:string[44];
  25.     ft:byte;
  26.     lastvar:byte;
  27.  
  28.  
  29. function tcheck(s:real; i:integer):boolean;
  30. var r:real;
  31. begin
  32.   r:=timer;
  33.   if r<s then r:=r+86400.0;
  34.   if trunc(r-s)>i then tcheck:=false else tcheck:=true;
  35. end;
  36.  
  37. function tchk(s:real; i:real):boolean;
  38. var r:real;
  39. begin
  40.   r:=timer;
  41.   if r<s then r:=r+86400.0;
  42.   if (r-s)>i then tchk:=false else tchk:=true;
  43. end;
  44.  
  45. {$I DLP1.PAS}
  46.  
  47. function okfile(fn:str):boolean;
  48. begin
  49.   okfile:=(pos('.LST',FN)=0) and (pos('.DAT',fn)=0) and (pos('.   ',fn)=0)
  50.           and (pos('.FIL',fn)=0) and (pos('.TRM',fn)=0) and (pos('.LOG',fn)=0);
  51.   if (not so) and (pos('.TXT',fn)=0) and (pos('.MSG',fn)=0)and (pos('.???',FN)=0)
  52.     then okfile:=false;
  53. end;
  54.  
  55. procedure printfile(fn:str);
  56. var fil:text;
  57.     i:str;
  58.     abort,next:boolean;
  59. begin
  60.  if not hangup then begin
  61.   assign(fil,fn);
  62.   {$I-} reset(fil); {$I+}
  63.   if ioresult<>0 then print('File not found.') else begin
  64.     abort:=false;
  65.     while not eof(fil) and (not abort) and (not hangup) do begin
  66.       readln(fil,i);
  67.       if i[length(i)]<>#1 then i:=i+#1;
  68.       printa(i,abort,next);
  69.     end;
  70.     close(fil);
  71.   end;
  72.   nl;nl;
  73.  end;
  74. end;
  75.  
  76. procedure inli(var i:str);
  77. var cp,rp:integer; c:char; cv,cc:integer;
  78. begin
  79.   rp:=1; cp:=1;
  80.   i:='';
  81.   if ll<>'' then begin prompt(ll); i:=ll; ll:=''; cp:=length(i)+1; rp:=cp;end;
  82.   repeat
  83.     getkey(c); skey(c);
  84.     case ord(c) of
  85.       32..126:if (cp<strlen) and (rp<thisuser.linelen) then begin
  86.                 i[cp]:=c; cp:=cp+1; rp:=rp+1; outkey(c); thisline:=thisline+c;
  87.               end;
  88.             127,8:if cp>1 then begin c:=chr(8);
  89.                 if i[cp-1]=chr(8) then begin prompt(' '); rp:=rp+1; end else
  90.                  if i[cp-1]<>chr(10) then
  91.                    begin prompt(c+' '+c); rp:=rp-1; end;
  92.                 cp:=cp-1;
  93.               end;
  94.            24:begin
  95.                 cp:=1; for cv:=1 to rp-1 do prompt(chr(8)+' '+chr(8));
  96.                 rp:=1;
  97.               end;
  98.            23:if cp>1 then repeat
  99.                 prompt(chr(8)+' '+chr(8)); rp:=rp-1; cp:=cp-1;
  100.               until (cp=1) or (i[cp]=' ') or (i[cp]=chr(8));
  101.            14:if (not (rbackspace in thisuser.ac)) and (rp>1) and (cp<strlen) then begin
  102.                 prompt(chr(8)); i[cp]:=chr(8); cp:=cp+1; rp:=rp-1;
  103.               end;
  104.            10:if (not (rbackspace in thisuser.ac)) and (cp<strlen) then begin
  105.                 prompt(c); i[cp]:=c; cp:=cp+1;
  106.               end;
  107.             9:begin
  108.                 cv:=5-(cp mod 5); if (cp+cv<strlen) and (rp+cv<thisuser.linelen) then
  109.                   for cc:=1 to cv do begin
  110.                     rp:=rp+1; prompt(' ');
  111.                     i[cp]:=' '; cp:=cp+1;
  112.                   end;
  113.               end;
  114.   end;
  115.   until (c=chr(13)) or ((rp=thisuser.linelen) and (wordwrap in thisuser.defaults)) or hangup;
  116.   i[0]:=chr(cp-1);
  117.   if c<>chr(13) then begin
  118.     cv:=cp-1;
  119.     while (cv>0) and (i[cv]<>' ') and (i[cv]<>chr(8))do cv:=cv-1;
  120.     if (cv>(rp div 2)) and (cv<>cp-1) then begin
  121.       ll:=copy(i,cv+1,cp-cv); for cc:=cp-2 downto cv do prompt(chr(8));
  122.       for cc:=cp-2 downto cv do prompt(' ');
  123.       i[0]:=chr(cv-1);
  124.     end;
  125.   end;
  126.   nl;
  127.   if c=chr(13) then i:=i+chr(1);
  128. end;
  129.  
  130. procedure ul;
  131. var dok,abort:boolean; i:str;
  132. f:file;
  133. begin
  134.   writeln; writeln; ft:=255;
  135.   prompt('Send file: ');
  136.   input(i,12);
  137.   i:='dloads\'+i;
  138.   assign(f,i);
  139.   {$I-} reset(f); {$I+}
  140.   if ioresult=0 then begin
  141.     close(f);
  142.     send1(i,dok,abort);
  143.   end else print('File not found.');
  144.   incom:=false;
  145.   hangup:=false;
  146.   outcom:=false;
  147.   writeln;
  148. end;
  149.  
  150. procedure dl;
  151. var dok:boolean; i:str; f:file;
  152. begin
  153.   writeln; writeln; ft:=255;
  154.   prompt('Receive file: ');
  155.   input(i,12);
  156.   i:='dloads\'+i;
  157.   assign(f,i);
  158.   {$I-} reset(f); {$I+}
  159.   if ioresult<>0 then begin
  160.     {$I-} rewrite(f); {$I+}
  161.     if ioresult=0 then begin
  162.       close(f);
  163.       dok:=true;
  164.     end else begin
  165.       dok:=false;
  166.       print('Illegal filename.');
  167.     end;
  168.   end else begin
  169.     close(f);
  170.     print(#7+'File already exists.');
  171.     prompt('Overwrite? ');
  172.     dok:=yn;
  173.   end;
  174.   if dok then
  175.     receive1(i,dok);
  176.   hangup:=false;
  177.   incom:=false;
  178.   outcom:=false;
  179. end;
  180.  
  181. procedure term;
  182. var c:char; done,bac,eco:boolean;
  183.     hs:byte;
  184.     ns:array[1..9] of pnr;
  185.     fil:file of pnr;
  186.     lnd,i:integer;
  187.     maxs:byte;
  188.     rl:real;
  189.  
  190.   procedure pc(s:str);
  191.   var i:integer;
  192.   begin
  193.     s:=s+chr(13);
  194.     for i:=1 to length(s) do o1(s[i]);
  195.   end;
  196.  
  197.   procedure cs(hs:byte);
  198.   begin
  199.     writeln;
  200.     case hs of
  201.       0:begin
  202.           set_baud(300);
  203.           writeln('--- 300 BAUD ---');
  204.         end;
  205.       1:begin
  206.           set_baud(1200);
  207.           writeln('=== 1200 BAUD ===');
  208.         end;
  209.       2:begin
  210.           set_baud(2400);
  211.           writeln('=-= 2400 BAUD =-=');
  212.         end;
  213.     end;
  214.     writeln;
  215.   end;
  216.  
  217.   procedure tab(x:integer);
  218.   begin
  219.     while wherex<x do write(' ');
  220.   end;
  221.  
  222.   procedure dial;
  223.   var i:integer; done:boolean; c:char; s:str;
  224.   begin
  225.     done:=false;
  226.     repeat
  227.       writeln;
  228.       write('Dial: 1-9,M,Q,? : ');
  229.       repeat
  230.         read(kbd,c); c:=upcase(c);
  231.       until c in ['1'..'9','M','Q','?'];
  232.       writeln(c); writeln;
  233.       if c='Q' then begin done:=true; writeln; writeln('Back in term mode.'); writeln; end;
  234.       if c='?' then begin
  235.         clrscr;
  236.         writeln('N NAME                                      NUMBER         SPD');
  237.         writeln('- ----------------------------------------  -------------  ----');
  238.         for i:=1 to 9 do begin
  239.           write(i,' ',ns[i].name); tab(44); write(ns[i].number); tab(60);
  240.           case ns[i].hs of
  241.             0:writeln(' 300');
  242.             1:writeln('1200');
  243.             2:writeln('2400');
  244.           end;
  245.         end;
  246.       end;
  247.       if c='M' then begin
  248.         write('Which (1-9) ? ');
  249.         repeat
  250.           read(kbd,c);
  251.         until c in ['1'..'9',#13];
  252.         if c in ['1'..'9'] then begin
  253.           i:=value(c);
  254.           clrscr;
  255.           writeln('Number: ',i);
  256.           writeln;
  257.           writeln('Old Name: ',ns[i].name);
  258.           write('New Name: '); inputl(s,40);
  259.           if s<>'' then ns[i].name:=s;
  260.           writeln;
  261.           writeln('Old Number: ',ns[i].number);
  262.           write('New Number: '); input(s,14);
  263.           if s<>'' then ns[i].number:=s;
  264.           writeln;
  265.           write('Old Speed: ');
  266.           case ns[i].hs of
  267.             0:writeln(' 300');
  268.             1:writeln('1200');
  269.             2:writeln('2400');
  270.           end;
  271.           writeln;
  272.           writeln('0 =  300');
  273.           if maxs>0 then writeln('1 = 1200');
  274.           if maxs>1 then writeln('2 = 2400');
  275.           write('New speed? '); read(kbd,c); if (c<'0') or (c>'2') then c:=#0;
  276.           writeln(c); writeln;
  277.           if (value(''+c)<=maxs) and (c<>#0)  then ns[i].hs:=value(''+c);
  278.           reset(fil); seek(fil,i-1); write(fil,ns[i]); close(fil);
  279.           c:=' ';
  280.         end;
  281.       end;
  282.       if c in ['1'..'9'] then begin
  283.         done:=true;
  284.         i:=value(c);
  285.         clrscr; lnd:=i;
  286.         hs:=ns[i].hs; cs(hs);
  287.         writeln('Dialing: ',ns[i].name);
  288.         writeln('At     : ',ns[i].number);
  289.         writeln;
  290.         pc('ATDT'+ns[i].number);
  291.       end;
  292.     until done;
  293.   end;
  294.  
  295.   function cdet:boolean;
  296.   begin
  297.     cdet:=((port[base+6] and 128)<>0)
  298.   end;
  299.  
  300.   procedure hang;
  301.   var rl:real;
  302.   begin
  303.     dump;
  304.     term_ready(false); rl:=timer;
  305.     while cdet and (abs(timer-rl)<1.5) do;
  306.     term_ready(true);
  307.   end;
  308.  
  309.   procedure redial;
  310.   var c:char; done:boolean; try:integer; rl,rl1,rl2:real; int:integer; i,i1:str;
  311.   begin
  312.     clrscr; try:=0;
  313.     hs:=ns[lnd].hs; cs(hs); rl:=timer;
  314.     pc('ATM0Q0V0E0S7=16');
  315.     writeln('Re-Dialing: ',ns[lnd].name);
  316.     writeln('At        : ',ns[lnd].number);
  317.     writeln('Try       : 0');
  318.     writeln('Time      : 00:00');
  319.     writeln; writeln('Hit <ESC> to abort'); done:=false;
  320.     delay(500); dump;
  321.     repeat
  322.       pc('ATDT'+ns[lnd].number);
  323.       try:=try+1;
  324.       gotoxy(13,6); writeln(try);
  325.       rl1:=timer; if rl1<rl then rl:=rl+24.0*3600.0;
  326.       rl2:=abs(rl1-rl); if rl2>32000 then rl2:=32000;
  327.       int:=trunc(rl2);
  328.       i:=cstr(int div 60);
  329.       if length(i)=1 then i:='0'+i;
  330.       i1:=cstr(int mod 60);
  331.       if length(i1)=1 then i1:='0'+i1;
  332.       i:=i+':'+i1;
  333.       gotoxy(13,7); writeln(i); dump;
  334.       while (not done) and (not commpressed) do begin
  335.         if keypressed then begin
  336.           read(kbd,c); if c=#27 then begin done:=true; o1('A'); end;
  337.         end;
  338.       end;
  339.       delay(100);
  340.       if cdet then done:=true else dump;
  341.     until done;
  342.     if cdet then for try:=1 to 6 do begin
  343.       sound(1200); delay(200); nosound; delay(100);
  344.     end else begin
  345.       delay(500); pc('ATM1Q0V1E1S7=30');
  346.     end;
  347.     gotoxy(1,14); writeln; writeln('Back in term mode...');
  348.   end;
  349.  
  350.   procedure help;
  351.   var x,y,c:integer;
  352.   begin
  353.     x:=wherex; y:=wherey;
  354.     for c:=1 to 10 do begin
  355.       gotoxy(42,c); write(#$b3);
  356.     end;
  357.     gotoxy(42,11); write(#$c0);
  358.     while wherex<>1 do write(#$c4);
  359.     window(43,1,80,10); clrscr;
  360.     window(45,1,80,10); gotoxy(1,1);
  361.     writeln('Alt-B = backspacing toggle');
  362.     writeln('Alt-C = clear screen');
  363.     writeln('Alt-D = dial number');
  364.     writeln('Alt-E = echo toggle');
  365.     writeln('Alt-H = hang up phone');
  366.     writeln('Alt-Q = redial last number');
  367.     writeln('Alt-S = speed toggle');
  368.     writeln('Alt-X = exit');
  369.     writeln('PgUp  = send file from dloads');
  370.     write('PgDn  = receive file into dloads');
  371.     window(1,1,80,25); gotoxy(x,y);
  372.   end;
  373.  
  374. begin
  375.   clrscr; lnd:=0; eco:=false;
  376.   if maxspd=300 then maxs:=0;
  377.   if maxspd=1200 then maxs:=1;
  378.   if maxspd=2400 then maxs:=2;
  379.   assign(fil,'gfiles\numbers.trm');
  380.   reset(fil);
  381.   for i:=1 to 9 do read(fil,ns[i]);
  382.   close(fil);
  383.   writeln('Press [HOME] for help');
  384.   writeln;
  385.   hs:=maxs; cs(hs); bac:=false;
  386.   done:=false; mem[$40:$17]:=mem[$40:$17] or $40;
  387.   pc('ATQ0V1E1S2=43M1S11=50');
  388.   rl:=timer;
  389.   repeat
  390.     if commpressed then begin
  391.       c:=cinkey;
  392.       if c=chr(12) then clrscr else
  393.         if c=chr(8) then begin
  394.           bs;
  395.           if bac then begin
  396.             write(' ');
  397.             bs;
  398.           end;
  399.         end
  400.       else
  401.         if c<>chr(0) then write(c);
  402.       rl:=timer;
  403.     end;
  404.     if keypressed then begin
  405.       read(kbd,c);
  406.       if c=chr(27) then
  407.         if keypressed then begin
  408.           read(kbd,c); case ord(c) of
  409.             48:begin bac:=not bac; writeln; writeln;
  410.                  if bac then writeln('-Destructive-') else writeln('=Non-Destructive=');
  411.                  writeln; writeln;
  412.                end;
  413.             45:done:=true;
  414.             31:begin hs:=hs+1; if hs>maxs then hs:=0; cs(hs); end;
  415.             32:dial;
  416.             16:if (lnd>0) and (lnd<10) then redial;
  417.             35:hang;
  418.             73:ul;
  419.             81:dl;
  420.             71:help;
  421.             46:clrscr;
  422.             18:begin eco:=not eco; writeln; writeln;
  423.                  if eco then writeln('-= ECHO ON =-') else writeln('=- ECHO OFF -=');
  424.                  writeln; writeln;
  425.                end;
  426.           end;
  427.       end else else begin o1(c); if eco then write(c); end;
  428.       rl:=timer;
  429.     end;
  430.     if abs(rl-timer)>5.0*60.0 then begin
  431.       if timer<rl then
  432.         rl:=rl-24.0*3600.0
  433.       else
  434.         done:=true;
  435.     end;
  436.   until done;
  437.   hang; delay(1000); pc('ATS0=0Q0V0E0M0S2=1S7=30'); delay(100); dump;
  438.   mem[$40:$17]:=mem[$40:$17] and not $40;
  439. end;
  440.  
  441. procedure voteprint;
  442. var vdata:file of vdatar; vd:vdatar; vn:integer; t:text; i1,i2:integer; u:userrec;
  443.     x:array[1..maxusers] of array[1..9] of integer;
  444.     s1,s2:str;
  445.  
  446. begin
  447.   assign(t,'gfiles\votes.txt');
  448.   rewrite(t);
  449.   writeln(t); writeln(t,'Votes as of '+dat);
  450.   reset(uf);
  451.   print('Beginning output to file "VOTES.TXT"');
  452.   i1:=1;
  453.   while (i1<filesize(uf)) do begin
  454.     seek(uf,i1); read(uf,u);
  455.     for i2:=1 to 9 do
  456.       x[i1][i2]:=u.vote[i2];
  457.     i1:=i1+1;
  458.   end;
  459.   close(uf);
  460.   assign(vdata,'gfiles\voting.dat');
  461.   reset(vdata);
  462.   for vn:=1 to 9 do begin
  463.     seek(vdata,vn-1); read(vdata,vd);
  464.     if vd.numa<>0 then begin
  465.       writeln(t); writeln(t,vd.question);
  466.       print(vd.question);
  467.       for i1:=1 to vd.numa do begin
  468.         writeln(t,'   '+vd.answ[i1].ans);
  469.         for i2:=1 to systat.users do begin
  470.           if x[srl[i2].number][vn]=i1 then begin
  471.             writeln(t,'      '+srl[i2].name+' #'+cstr(srl[i2].number));
  472.           end;
  473.         end;
  474.       end;
  475.     end;
  476.   end;
  477.   close(t);
  478.   print('Output complete.');
  479. end;
  480.  
  481. procedure return;
  482. var f:file;
  483. begin
  484.   assign(f,'bbs.com');
  485.   print('Returning to BBS...');
  486.   remove_port;
  487.   if hangup then term_ready(false);
  488.   execute(f);
  489. end;
  490.  
  491.  
  492. procedure parse(i1:str);
  493. var c,lp,cp:integer;
  494. begin
  495.   for c:=1 to 9 do ix[c]:='';
  496.   c:=1; lp:=1; cp:=1;
  497.   if length(i1)=1 then ix[1]:=i1;
  498.   while cp<length(i1) do begin
  499.     cp:=cp+1;
  500.     if (i1[cp]=' ') or (cp=length(i1)) then begin
  501.       if cp=length(i1) then cp:=cp+1;
  502.       ix[c]:=copy(i1,lp,(cp-lp));
  503.       lp:=cp+1;
  504.       c:=c+1;
  505.     end;
  506.   end;
  507. end;
  508.  
  509. function align(fn:str):str;
  510. var f,e,t:str; c,c1:integer;
  511. begin
  512.   c:=pos('.',fn);
  513.   if c=0 then begin
  514.     f:=fn; e:='   ';
  515.   end else begin
  516.     f:=copy(fn,1,c-1); e:=copy(fn,c+1,3);
  517.   end;
  518.   while length(f)<8 do f:=f+' ';
  519.   while length(e)<3 do e:=e+' ';
  520.   c:=pos('*',f); if c<>0 then for c1:=c to 8 do f[c1]:='?';
  521.   c:=pos('*',e); if c<>0 then for c1:=c to 3 do e[c1]:='?';
  522.   align:=f+'.'+e;
  523. end;
  524.  
  525. function vdir(var d:str):boolean;
  526. var x:boolean;
  527. begin
  528.   if d[length(d)]='\' then d:=copy(d,1,length(d)-1);
  529.   if (d='DLOADS') or (d='GFILES') then x:=true else x:=false;
  530.   if (d='.') and so then x:=true;
  531.   vdir:=x;
  532. end;
  533.  
  534. procedure fix(var fn:str);
  535. var i,i1:str; c1,c2:integer; ok:boolean;
  536. begin
  537.   if vdir(fn) then fn:=fn+'\';
  538.   c1:=pos('\',fn); ok:=true;
  539.   if c1<>0 then begin
  540.     i:=copy(fn,1,c1-1);
  541.     fn:=copy(fn,c1+1,15);
  542.     if not vdir(i) then ok:=false;
  543.   end else i:='';
  544.   if i='' then i:=cd;
  545.   if fn='' then fn:='*.*';
  546.   fn:=i+'\'+align(fn);
  547.   if (pos('.MSG',fn)=0) and (pos('.TXT',fn)=0) and (pos('?',fn)=0) and (not so) then ok:=false;
  548.   if not ok then fn:='';
  549.   if not okfile(fn) then fn:='';
  550. end;
  551.  
  552. function fit(f1,f2:str):boolean;
  553. var tf:boolean; c:integer;
  554. begin
  555.   tf:=true;
  556.   for c:=1 to 12 do
  557.     if (f1[c]<>f2[c]) and (f1[c]<>'?') then tf:=false;
  558.   fit:=tf;
  559. end;
  560.  
  561. overlay procedure tedit;
  562. var cur,nex,las,b4:strptr;
  563.     top,bottom,used:strptr;
  564.     tline,curline,c1,c2:integer;
  565.     fil:text;
  566.     abort,next,done,allread:boolean;
  567.     i1,i2:str;
  568.  
  569.   function newptr(var x:strptr):boolean;
  570.   begin
  571.     if used<>nil then begin
  572.       x:=used;
  573.       used:=used^.next;
  574.       newptr:=true;
  575.     end else begin
  576.       if (maxavail<0) or (maxavail>100) then begin
  577.         new(x);
  578.         newptr:=true;
  579.       end else newptr:=false;
  580.     end;
  581.   end;
  582.  
  583.   procedure oldptr(var x:strptr);
  584.   begin
  585.     x^.next:=used;
  586.     used:=x;
  587.   end;
  588.  
  589.   procedure pline(cl:integer; var cp:strptr; var abort:boolean);
  590.   var next:boolean; i:str;
  591.   begin
  592.     if not abort then begin
  593.       if cp=nil then i:='      [END]' else begin
  594.         i:=cstr(cl);
  595.         while length(i)<4 do i:=' '+i;
  596.         i:=i+': '+cp^.i;
  597.       end;
  598.       printacr(i,abort,next);
  599.     end;
  600.   end;
  601.  
  602.   procedure pl;
  603.   var abort:boolean;
  604.   begin
  605.     abort:=false;
  606.     pline(curline,cur,abort);
  607.   end;
  608.  
  609. begin
  610.   nl; allread:=true;
  611.   used:=nil;
  612.   top:=nil;
  613.   bottom:=nil;
  614.   fix(ix[2]);
  615.   if (pos('.MSG',ix[2])=0) and (pos('.TXT',ix[2])=0) then ix[2]:='';
  616.   if ix[2]='' then print('Illegal filename.') else begin
  617.     assign(fil,ix[2]); abort:=false;
  618.     {$I-} reset(fil); {$I+}
  619.     tline:=0;
  620.     new(cur);
  621.     cur^.last:=nil;
  622.     cur^.i:='';
  623.     if ioresult<>0 then begin
  624.       {$I-} rewrite(fil); {$I+}
  625.       if ioresult<>0 then begin
  626.         print('Illegal filename.');
  627.         abort:=true;
  628.       end else begin
  629.         close(fil); erase(fil);
  630.         print('New file.');
  631.         tline:=0;
  632.         cur:=nil; top:=cur; bottom:=cur;
  633.       end;
  634.     end else begin
  635.       abort:=not newptr(nex);
  636.       top:=nex;
  637.       print('Loading...');
  638.       while (not eof(fil)) and (not abort) do begin
  639.         tline:=tline+1;
  640.         cur^.next:=nex;
  641.         nex^.last:=cur;
  642.         cur:=nex;
  643.         readln(fil,i1);
  644.         cur^.i:=i1;
  645.         abort:=not newptr(nex);
  646.       end;
  647.       close(fil);
  648.       cur^.next:=nil;
  649.       if tline=0 then begin cur:=nil; top:=nil; end;
  650.       bottom:=cur;
  651.       if abort then begin print('Not all of file read.'); allread:=false; end;
  652.       abort:=false;
  653.     end;
  654.     if not abort then begin
  655.       print('Total lines: '+cstr(tline));
  656.       cur:=top;
  657.       if top<>nil then top^.last:=nil;
  658.       curline:=1;
  659.       done:=false;
  660.       pl;
  661.       repeat
  662.         prompt(':');
  663.         input(i1,10);
  664.         if i1='' then i1:='+';
  665.         if value(i1)>0 then begin
  666.           c1:=value(i1);
  667.           if (c1>0) and (c1<=tline) then begin
  668.             while c1<>curline do
  669.               if c1<curline then begin
  670.                 if cur=nil then begin
  671.                   cur:=bottom;
  672.                   curline:=tline;
  673.                 end else begin
  674.                   curline:=curline-1;
  675.                   cur:=cur^.last;
  676.                 end;
  677.               end else begin
  678.                 curline:=curline+1;
  679.                 cur:=cur^.next;
  680.               end;
  681.             pl;
  682.           end;
  683.         end else case i1[1] of
  684.           '+':if cur<>nil then begin
  685.                 c1:=value(copy(i1,2,9));
  686.                 if c1=0 then c1:=1;
  687.                 while (cur<>nil) and (c1>0) do begin
  688.                   cur:=cur^.next;
  689.                   curline:=curline+1;
  690.                   c1:=c1-1;
  691.                 end;
  692.                 pl;
  693.               end;
  694.           '?':begin
  695.                 print('P:rint line      L:ist');
  696.                 print('-:back line      +:forward line');
  697.                 print('T:op             B:ottom');
  698.                 print('I:nsert lines    D:elete line');
  699.                 print('R:eplace line    C:lear workspace');
  700.                 print('Q:uit            S:ave');
  701.               end;
  702.           '-':begin
  703.                 c1:=value(copy(i1,2,9));
  704.                 if c1=0 then c1:=1;
  705.                 if cur=nil then begin
  706.                   cur:=bottom;
  707.                   curline:=tline;
  708.                   c1:=c1-1;
  709.                 end;
  710.                 if cur<>nil then
  711.                   if cur^.last<>nil then begin
  712.                     while (cur^.last<>nil) and (c1>0) do begin
  713.                       cur:=cur^.last;
  714.                       curline:=curline-1;
  715.                       c1:=c1-1;
  716.                     end;
  717.                     pl;
  718.                   end;
  719.               end;
  720.           'C':begin
  721.                 prompt('Clear workspace? ');
  722.                 if yn then begin
  723.                   tline:=0; curline:=1;
  724.                   cur:=nil; top:=nil; bottom:=nil;
  725.                   release(topheap);
  726.                 end;
  727.               end;
  728.           'P':pl;
  729.           'D':begin
  730.                 c1:=value(copy(i1,2,9));
  731.                 if c1=0 then c1:=1;
  732.                 while (cur<>nil) and (c1>0) do begin
  733.                   las:=cur^.last;
  734.                   nex:=cur^.next;
  735.                   if las<>nil then las^.next:=nex;
  736.                   if nex<>nil then nex^.last:=las;
  737.                   oldptr(cur);
  738.                   if bottom=cur then bottom:=las;
  739.                   if top=cur then top:=nex;
  740.                   cur:=nex;
  741.                   tline:=tline-1;
  742.                   c1:=c1-1;
  743.                 end;
  744.                 pl;
  745.               end;
  746.           'R':if cur<>nil then begin
  747.                 pl;
  748.                 i2:=cstr(curline); while length(i2)<>4 do i2:=' '+i2;
  749.                 i2:=i2+': '; prompt(i2);
  750.                 inli(i1);
  751.                 cur^.i:=i1;
  752.               end;
  753.           'I':begin
  754.                 abort:=false; ll:='';
  755.                 print('Enter "." on a seperate line to exit insert mode.');
  756.                 i1:=''; thisuser.linelen:=thisuser.linelen-6;
  757.                 while (not abort) and (i1<>'.') and (i1<>'.'+#1) do begin
  758.                   i2:=cstr(curline); while length(i2)<>4 do i2:=' '+i2;
  759.                   i2:=i2+': '; prompt(i2);
  760.                   inli(i1);
  761.                   if (i1<>'.') and (i1<>'.'+#1) then begin
  762.                     abort:=not newptr(nex);
  763.                     if not abort then begin
  764.                       nex^.i:=i1;
  765.                       if (top=cur) then
  766.                         if cur=nil then begin
  767.                           nex^.last:=nil;
  768.                           nex^.next:=nil;
  769.                           top:=nex;
  770.                           bottom:=nex;
  771.                         end else begin
  772.                           nex^.next:=cur;
  773.                           cur^.last:=nex;
  774.                           top:=nex;
  775.                         end
  776.                       else begin
  777.                         if cur=nil then begin
  778.                           bottom^.next:=nex;
  779.                           nex^.last:=bottom;
  780.                           nex^.next:=nil;
  781.                           bottom:=nex;
  782.                         end else begin
  783.                           las:=cur^.last;
  784.                           nex^.last:=las;
  785.                           nex^.next:=cur;
  786.                           cur^.last:=nex;
  787.                           las^.next:=nex;
  788.                         end;
  789.                       end;
  790.                       curline:=curline+1;
  791.                       tline:=tline+1;
  792.                     end else print('No room left.');
  793.                   end;
  794.                 end;
  795.                 thisuser.linelen:=thisuser.linelen+6;
  796.               end;
  797.           'T':begin
  798.                 cur:=top;
  799.                 curline:=1;
  800.                 pl;
  801.               end;
  802.           'B':begin
  803.                 cur:=nil;
  804.                 curline:=tline+1;
  805.                 pl;
  806.               end;
  807.           'L':begin
  808.                 abort:=false;
  809.                 nex:=cur;
  810.                 c1:=curline;
  811.                 while (not abort) and (nex<>nil) do begin
  812.                   pline(c1,nex,abort);
  813.                   nex:=nex^.next;
  814.                   c1:=c1+1;
  815.                 end;
  816.               end;
  817.           'Q':done:=true;
  818.           'S':begin
  819.                 if not allread then begin
  820.                   prompt('Not all of file read.  Save anyway? ');
  821.                   allread:=yn;
  822.                 end;
  823.                 if allread then begin
  824.                   done:=true;
  825.                   writeln('Saving...');
  826.                   rewrite(fil);
  827.                   cur:=top;
  828.                   while cur<>nil do begin
  829.                     writeln(fil,cur^.i);
  830.                     cur:=cur^.next;
  831.                   end;
  832.                   close(fil);
  833.                 end;
  834.               end;
  835.         end;
  836.       until done;
  837.     end;
  838.   end;
  839.   release(topheap);
  840. end;
  841.  
  842. overlay procedure gfileedit;
  843. var b,b1:gft; f:file of gft; i:str; t,c:integer; ok,exit:boolean;
  844.     gftit:array[1..150] of record tit:string[80]; arn:integer; gfile:boolean;end;
  845.     nums,lgftn,numgft:integer;
  846.     gfs:array[0..100] of record tit:string[80]; arn:integer; end;
  847.     c1,c2,c3,c4:integer; s1,s2,s3,s4:str; ch:char;
  848.  
  849.   procedure gettit(n:integer);
  850.   var r:integer; b:gft;
  851.   begin
  852.     numgft:=0;
  853.     r:=n+1;
  854.     if r<=t then begin
  855.       seek(f,r); read(f,b);
  856.       while (r<=t) and (b.filen[1]<>#1) do begin
  857.         begin
  858.           numgft:=numgft+1;
  859.           gftit[numgft].tit:=b.title;
  860.           gftit[numgft].arn:=r;
  861.           gftit[numgft].gfile:=true;
  862.         end;
  863.         r:=r+1;
  864.         if (r<=t) then begin seek(f,r); read(f,b);end;
  865.       end;
  866.     end;
  867.   end;
  868.  
  869.   procedure getsec;
  870.   var r:integer; b:gft;
  871.   begin
  872.     nums:=0;
  873.     gfs[0].tit:='[ Main Section ]';
  874.     gfs[0].arn:=0;
  875.     for r:=1 to t do begin
  876.       seek(f,r); read(f,b);
  877.       if b.filen[1]=#1 then begin
  878.         nums:=nums+1;
  879.         gfs[nums].tit:='[ '+b.title+' ]';
  880.         gfs[nums].arn:=r;
  881.       end;
  882.     end;
  883.     gfs[nums+1].arn:=t+1;
  884.   end;
  885.  
  886.   procedure listsec;
  887.   var r:integer; i:str; abort,next:boolean;
  888.   begin
  889.     r:=0; abort:=false; nl; nl;
  890.     while (r<=nums) and (not abort) do begin
  891.       i:=cstr(r)+': '+gfs[r].tit;
  892.       r:=r+1;
  893.       printacr(i,abort,next);
  894.     end;
  895.   end;
  896.  
  897.   procedure lgft;
  898.   var abort,next:boolean; c:integer; b:gft;
  899.   begin
  900.     nl; nl;
  901.     if numgft=0 then print('No G-files.') else begin
  902.       abort:=false; next:=false; c:=1;
  903.       while (c<=numgft) and (not abort) do begin
  904.         seek(f,gftit[c].arn); read(f,b);
  905.         i:=cstr(c)+': '; if length(i)=3 then i:=' '+i;
  906.         i:=i+b.filen;
  907.         while length(i)<18 do i:=i+' ';
  908.         i:=i+cstr(b.num);
  909.         while length(i)<24 do i:=i+' ';
  910.         i:=i+b.title;
  911.         printacr(i,abort,next);
  912.         c:=c+1;
  913.       end;
  914.     end;
  915.   end;
  916.  
  917. begin
  918.   nl;assign(f,'gfiles\gfiles.dat'); {$I-} reset(f); {$I+}
  919.   if ioresult<>0 then begin
  920.     rewrite(f); b.num:=0; write(f,b);
  921.   end;
  922.   seek(f,0); read(f,b); t:=b.num; exit:=false;
  923.     repeat
  924.       nl; nl;prompt('Gfile Edit: Q,I,D,S,? : ');
  925.       onek(ch,'QIDS?'); getsec;
  926.       case ch of
  927.         'Q':exit:=true;
  928.         '?':begin
  929.               print('Q:uit from gfile edit   ?:this list');
  930.               print('I:nsert G-file          D:delete G-file');
  931.               print('S:ection modification');
  932.             end;
  933.         'S':begin
  934.               prompt('I:nsert, D:elete, Q:uit ? '); onek(ch,'QID');
  935.               case ch of
  936.                 'I':begin
  937.                       listsec;
  938.                       prompt('Before which section (1-'+cstr(nums+1)+') : '); input(s1,2);
  939.                       c1:=value(s1);
  940.                       if (c1>0) and (c1<=(nums+1)) then begin
  941.                         if c1<=nums then
  942.                           c1:=gfs[c1].arn
  943.                         else
  944.                           c1:=t+1;
  945.                         prompt('Section title? '); inputl(b.title,40);
  946.                         prompt('SL requirement? '); input(s1,3);
  947.                         b.num:=value(s1); b.filen:=#1#0#0#0#0#0;
  948.                         for c3:=t downto c1 do begin
  949.                           seek(f,c3); read(f,b1); seek(f,c3+1); write(f,b1);
  950.                         end;
  951.                         seek(f,c1); write(f,b); t:=t+1;
  952.                         b.num:=t; seek(f,0); write(f,b);
  953.                       end else print('Illegal section number.');
  954.                     end;
  955.                 'D':begin
  956.                       listsec;
  957.                       prompt('Delete which section (1-'+cstr(nums)+') : '); input(s1,2);
  958.                       c1:=value(s1);
  959.                       if ((c1>0) and (c1<=nums)) then begin
  960.                         c2:=gfs[c1].arn;
  961.                         if c1=nums then c3:=t+1 else c3:=gfs[c1+1].arn;
  962.                         c1:=(c3-c2);
  963.                         for c4:=c3 to t do begin
  964.                           seek(f,c4); read(f,b); seek(f,c4-c1); write(f,b);
  965.                         end;
  966.                         seek(f,0); t:=t-c1; b.num:=t; write(f,b);
  967.                       end;
  968.                     end;
  969.               end;
  970.             end;
  971.         'D':begin
  972.               listsec;
  973.               prompt('Which section (0-'+cstr(nums)+') : '); input(s1,2);
  974.               c1:=value(s1);
  975.               if (s1='0') or ((c1>0) and (c1<=nums)) then begin
  976.                 gettit(gfs[c1].arn);
  977.                 lgft;
  978.                 prompt('Delete which (1-'+cstr(numgft)+') :');
  979.                 input(s1,3);
  980.                 c1:=value(s1);
  981.                 if (c1>0) and (c1<=(numgft)) then begin
  982.                   c1:=gftit[c1].arn;
  983.                   for c2:=c1+1 to t do begin
  984.                     seek(f,c2); read(f,b); seek(f,c2-1); write(f,b);
  985.                   end;
  986.                   seek(f,0); read(f,b); b.num:=b.num-1;
  987.                   seek(f,0); write(f,b); t:=t-1;
  988.                 end;
  989.               end;
  990.             end;
  991.         'I':begin
  992.               listsec;
  993.               prompt('Which section (0-'+cstr(nums)+') : '); input(s1,2);
  994.               c1:=value(s1);
  995.               if (s1='0') or ((c1>0) and (c1<=nums)) then begin
  996.                 gettit(gfs[c1].arn);
  997.                 lgft; c4:=c1;
  998.                 prompt('Insert before which (1-'+cstr(numgft+1)+') :');
  999.                 input(s1,3);
  1000.                 c1:=value(s1);
  1001.                 if (c1>0) and (c1<=(numgft+1)) then begin
  1002.                   if c1<=numgft then
  1003.                     c2:=gftit[c1].arn
  1004.                   else
  1005.                     c2:=gfs[c4+1].arn;
  1006.                   prompt('Enter filename of new G-file : ');
  1007.                   input(b.filen,12); if (pos('.TXT',b.filen)=0) and
  1008.                   (pos('.MSG',b.filen)=0) then b.filen:='';
  1009.                   assign(f1,'gfiles\'+b.filen); {$I-} reset(f1); {$I+}
  1010.                   ok:=false; if ioresult=0 then begin close(f1); ok:=true; end;
  1011.                   if b.filen='' then ok:=false;
  1012.                   if ok then begin
  1013.                     nl; prompt('Enter title : '); inputl(b.title,40);
  1014.                     prompt('Enter SL : ');
  1015.                     input(i,3); b.num:=value(i);
  1016.                     for c3:=t downto c2 do begin
  1017.                       seek(f,c3); read(f,b1); seek(f,c3+1); write(f,b1);
  1018.                     end;
  1019.                     seek(f,c2); write(f,b); t:=t+1;
  1020.                     seek(f,0); read(f,b); b.num:=b.num+1; seek(f,0); write(f,b);
  1021.                   end else print('Illegal filename.');
  1022.                 end;
  1023.               end;
  1024.             end;
  1025.       end;
  1026.     until exit or hangup;
  1027.   close(f);
  1028.   nl;nl;
  1029. end;
  1030.  
  1031.  
  1032. function ffile(x:str):str;
  1033. var r:regs; x1:str;
  1034. begin
  1035.   x:=align(x); x1:=copy(x,1,8)+copy(x,10,3);
  1036.   fat:= #255#0#0#0#0#0#0#0+x1+#0#0#0#0+'                     ';
  1037.   dta := #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
  1038.                #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;
  1039.   r.ds := seg(dta);
  1040.   r.dx := ofs(dta)+1;
  1041.   r.ax := $1a00;
  1042.   msdos(r);
  1043.   r.ds := seg(fat);
  1044.   r.dx := ofs(fat)+1;
  1045.   r.ax := $1100;
  1046.   msdos(r);
  1047.   if r.ax=$1100 then x1:=copy(dta,9,8)+'.'+copy(dta,17,3) else x1:='';
  1048.   ffile:=x1;
  1049. end;
  1050.  
  1051. function nfile:str;
  1052. var x1:str; r:regs;
  1053. begin
  1054.   r.ax:=$1200;
  1055.   r.ds := seg(fat);
  1056.   r.dx := ofs(fat)+1;
  1057.   msdos(r);
  1058.   if r.ax=$1200 then x1:=copy(dta,9,8)+'.'+copy(dta,17,3) else x1:='';
  1059.   nfile:=x1;
  1060. end;
  1061.  
  1062. procedure dir(cd,x:str; all:boolean);
  1063. var
  1064.   abort,next:boolean;
  1065.   x1:str;
  1066. begin
  1067.   if cd<>'.' then chdir(cd);
  1068.   x1:=ffile(x);
  1069.   nl; abort:=false;
  1070.   while (x1<>'') and not abort do begin
  1071.     if ((copy(x1,10,3)='MSG') or (copy(x1,10,3)='TXT') or all) and okfile(x1) then
  1072.       printacr(x1,abort,next);
  1073.     x1:=nfile;
  1074.   end;
  1075.   nl; printacr('  Free space = '+cstr(freek)+'k',abort,next);
  1076.   if cd<>'.' then chdir('..');
  1077. end;
  1078.  
  1079. procedure copyfile(srcname,destname:str);
  1080. var buffer: array[1..16384] of byte;
  1081.     nrec:integer;
  1082.     src, dest: file;
  1083. begin
  1084.   assign(src,srcname); reset(src,1);
  1085.   if trunc(longfilesize(src)/1024.0)+1>=freek then
  1086.     print('Disk full.')
  1087.   else begin
  1088.     assign(dest,destname); rewrite(dest,1);
  1089.     nl; print('Copying...');
  1090.     repeat
  1091.       blockread(src,buffer,16384,nrec);
  1092.       blockwrite(dest,buffer,nrec);
  1093.     until nrec<16384;
  1094.     close(dest);
  1095.   end;
  1096.   close(src);
  1097. end;
  1098.  
  1099.  
  1100. procedure ren;
  1101. begin
  1102.   fix(ix[2]); fix(ix[3]); abort:=false; nl;
  1103.   if (ix[2]='') or (ix[3]='') then begin abort:=true; print('Illegal filename.'); end;
  1104.   if not abort then begin
  1105.     assign(f,ix[2]); {$I-} reset(f); {$I+}
  1106.     if ioresult=0 then begin
  1107.       close(f); assign(f,ix[3]); {$I-} reset(f); {$I+}
  1108.       if ioresult<>0 then begin
  1109.         {$I-} rewrite(f); {$I+}
  1110.         if ioresult=0 then begin
  1111.           close(f); erase(f); assign(f,ix[2]); rename(f,ix[3]);
  1112.           print('Renamed.');
  1113.         end else print('Illegal filename.');
  1114.       end else begin close(f); print('Filename already in use.'); end;
  1115.     end else print('File not found.');
  1116.   end;
  1117. end;
  1118.  
  1119. procedure delfil;
  1120. begin
  1121.   nl;
  1122.   fix(ix[2]);
  1123.   if (not so) and (pos('.TXT',ix[2])=0) then begin
  1124.     ix[2]:='';
  1125.   end;
  1126.   if ix[2]<>'' then begin
  1127.     assign(f,ix[2]);
  1128.     {$I-} erase(f); {$I+}
  1129.     if ioresult=0 then print('Deleted.') else print('File not found.');
  1130.   end else print('Illegal filename.');
  1131. end;
  1132.  
  1133. procedure copyf;
  1134. begin
  1135.   fix(ix[2]); fix(ix[3]); nl;
  1136.   if (pos('????????.???',ix[3])<>0) then begin
  1137.     s1:=copy(ix[3],1,pos('\',ix[3])-1);
  1138.     s2:=copy(ix[2],pos('\',ix[2])+1,12);
  1139.     ix[3]:=s1+'\'+s2;
  1140.   end;
  1141.   if (ix[2]='') or (ix[3]='') then print('Illegal filename.') else begin
  1142.     assign(f,ix[2]); assign(f1,ix[3]);
  1143.     {$I-} reset(f); {$I+}
  1144.     if ioresult<>0 then print('File not found.') else begin
  1145.       close(f);
  1146.       {$I-} reset(f1); {$I+}
  1147.       if ioresult=0 then begin
  1148.         print('File already exists.');
  1149.         close(f1);
  1150.       end else begin
  1151.         {$I-} rewrite(f1); {$I+}
  1152.         if ioresult<>0 then begin close(f); print('Illegal filename.'); end else begin
  1153.           close(f1);
  1154.           copyfile(ix[2],ix[3]);
  1155.         end;
  1156.       end;
  1157.     end;
  1158.   end;
  1159. end;
  1160.  
  1161. procedure dirf;
  1162. begin
  1163.   all:=false;
  1164.   if not (vdir(ix[2]) or (ix[2]='')) and so then all:=true;
  1165.   fix(ix[2]);
  1166.   c1:=pos('\',ix[2]);
  1167.   s1:=copy(ix[2],1,c1-1);
  1168.   s2:=copy(ix[2],c1+1,12);
  1169.   if s1='' then s1:=cd;
  1170.   nl; dir(s1,s2,all);
  1171. end;
  1172.  
  1173. procedure typef;
  1174. begin
  1175.   nl;
  1176.   fix(ix[2]);
  1177.   if ix[2]<>'' then printfile(ix[2]) else print('Illegal filename.');
  1178. end;
  1179.  
  1180. procedure loadhelp;
  1181. var f:file; ch1:char; a,b,c:integer;
  1182. begin
  1183.   assign(f,'gfiles\help.msg');
  1184.   for ch1:='0' to '^' do helpi[ch1]:=0;
  1185.   {$I-} reset(f,1); {$I+}
  1186.   if ioresult=0 then begin
  1187.     blockread(f,help[1],25000,a);
  1188.     close(f);
  1189.     b:=1;
  1190.     while (b<a) do begin
  1191.       if help[b]='|' then begin
  1192.         ch1:=help[b+1];
  1193.         if ch1 in ['0'..'^'] then begin
  1194.           c:=b;
  1195.           while (help[c]<>#10) and (abs(c-b)<80) do c:=c+1;
  1196.           c:=c+1;
  1197.           if c<a then helpi[ch1]:=c;
  1198.         end;
  1199.       end;
  1200.       b:=b+1;
  1201.     end;
  1202.     help[a+1]:='|';
  1203.     print('Help file loaded.');
  1204.   end else print('No help file present.');
  1205.   nl;
  1206. end;
  1207.  
  1208.  
  1209. procedure dosfc;
  1210. begin
  1211.   nl; prompt(cd+': ');
  1212.   input(i1,35); parse(i1);
  1213.   if ix[1]='?' then begin
  1214.     nl; nl; printfile('gfiles\dosmnu.msg');
  1215.   end;
  1216.   if ix[1]='EDIT' then tedit;
  1217.   if ix[1]='VOTEPRINT' then voteprint;
  1218.   if ix[1]='LOADHELP' then loadhelp;
  1219.   if ix[1]='GFILE' then gfileedit;
  1220.   if ix[1]='QUIT' then donedos:=true;
  1221.   if ix[1]='DEL' then delfil;
  1222.   if ix[1]='TYPE' then typef;
  1223.   if ix[1]='REN' then ren;
  1224.   if ix[1]='DIR' then dirf;
  1225.   if ix[1]='CD' then if vdir(ix[2]) then cd:=ix[2];
  1226.   if ix[1]='COPY' then copyf;
  1227.   if ix[1]='CLS' then cls;
  1228. end;
  1229.  
  1230. begin
  1231.   iport; cd:='GFILES';
  1232.   topheap:=ptr(seg(lastvar),ofs(lastvar));
  1233.   release(topheap);
  1234.   case upcase(cmd) of
  1235.     'D':begin
  1236.           donedos:=false;
  1237.           print('Now in Mini-DOS.  "?" for help');
  1238.           print('Only .TXT or .MSG files can be accessed.'); nl; nl;
  1239.           while (not hangup) and (not donedos) do
  1240.             dosfc;
  1241.         end;
  1242.     'T':term;
  1243.     'G':gfileedit;
  1244.     'E':begin
  1245.           prompt('Filename: ');
  1246.           input(ix[2],12);
  1247.           tedit;
  1248.         end;
  1249.   end;
  1250.   return;
  1251. end.